# coding: utf-8

class Contador(object):
    '''
    Classe para contar ocorrências de itens
    
    Exemplo de uso::
    
        >>> c = Contador()
        >>> s = 'abacaxi'
        >>> for letra in s: c.incluir(letra)
        >>> c.contar('a')
        3
        >>> c.contar('b')
        1
        >>> c.contar('z')
        Traceback (most recent call last):
            ...
        KeyError: 'z'
    
    '''

    def __init__(self):
        self.dic = {}

    def incluir(self, item):
        qtd = self.dic.get(item, 0) + 1
        self.dic[item] = qtd

    def contar(self, item):
        return self.dic[item]

class ContadorTolerante(Contador):
    '''
    Classe para contar ocorrências de itens sem levantar exceção quando
    o item não existe

    Exemplo de uso::
    
        >>> c = ContadorTolerante()
        >>> s = 'abacaxi'
        >>> for letra in s: c.incluir(letra)
        >>> c.contar('a')
        3
        >>> c.contar('b')
        1
        >>> c.contar('z')
        0

    '''
    
    def contar(self, item):
        return self.dic.get(item, 0)

class ContadorTotalizador(Contador):
    '''Conta e calcula porcentage de ocorrencias
    
    Exemplo de uso::
    
        >>> c = ContadorTotalizador()
        >>> s = 'banana'
        >>> for letra in s: c.incluir(letra)
        >>> c.contar('a')
        3
        >>> c.contar('b')
        1
        >>> c.porcentagem('a')
        '50.0%'
        >>> c.__total
        6
        
    '''

    __total = 0
            
    def incluir(self, item):
        super(ContadorTotalizador, self).incluir(item)
        self.__total += 1
        
    def porcentagem(self, item):
        pct = 100.0 * self.contar(item) / self.__total
        return '%0.1f%%' % pct    

if __name__=='__main__':
    import doctest
    print '%s erros em %s testes' % doctest.testmod()

